#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/9/27 18:08
# @Author  : 朱宽
# @File    : browserController.py
# @Software: Win10、Python3.8.5 and Pycharm
'''
控制浏览器的相关方法，依据不同参数，启动不同浏览器。
静默启动等options设置可以封装在这里
参考selenium自动化测试这本书中的 11.1.4

处理多窗口，句柄-11.15

页面截图，使用BeautifulReport的截图装饰器，不在这里

杀浏览器进程-11.18
'''

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from config import globalConfig
import os
import time


class browserController():
    '''
    定义了：
    1、控制不同浏览器，有界面显示
    2、浏览器后退
    3、浏览器前进
    4、打开url站点
    5、关闭并停止浏览器服务
    6、设置浏览器窗口宽和高
    7、获得当前浏览器的句柄
    8、获得所有句柄
    9、切换句柄
    10、关闭新窗口
    11、杀浏览器进程（指定的）
    '''
    def __init__(self,headless=False):
        '''
        初始化添加项
        :param headless:是否静默启动；即 是否开启界面
        '''
        ''' 初始化浏览器驱动路径 '''
        self.firefox_web_driver_path = globalConfig.web_driver_path + 'geckodriver.exe' #驱动有BUG
        self.chrome_web_driver_path = globalConfig.web_driver_path + 'chromedriver.exe'
        self.edge_web_driver_path= globalConfig.web_driver_path + 'msedgedriver.exe'
        self.ie_web_driver_path = globalConfig.web_driver_path + 'IEDriverServer.exe'

        ''' 添加谷歌浏览器禁用项 '''
        self.chrome_options = Options()
        # 隐藏自动化控制
        self.chrome_options.add_experimental_option('useAutomationExtension', False)
        self.chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
        if headless==True:
            self.chrome_options.add_argument('--headless') #静默启动


    def driver_browser(self, browser_type, url):
        '''
        1、根据不同的参数，启动不同的浏览器。
        :param browser_type:
        :param url:
        :return:
        '''
        try:
            if browser_type.lower() == "firefox":  # browser_type.lower()，将browser_type的值转换为小写
                driver = webdriver.Firefox(executable_path=self.firefox_web_driver_path) # 会自动生成geckodriver.log，selenium的BUG
            elif browser_type.lower() == "chrome":
                driver = webdriver.Chrome(options=self.chrome_options,executable_path=self.chrome_web_driver_path)
            elif browser_type.lower() == "edge":
                driver=webdriver.Edge(executable_path=self.edge_web_driver_path)
            else:
                driver = webdriver.Ie(executable_path=self.ie_web_driver_path)
            driver.get(url)
            driver.maximize_window()
            driver.implicitly_wait(20)  # 隐式等待 作用于全局,也被叫做 全局等待

            return driver
        except Exception as e:
            raise e

    def back(self, driver):
        '''
        2、浏览器后退
        :return:
        '''
        driver.back()

    def forward(self, driver):
        '''
        3、浏览器前进
        :return:
        '''
        driver.forward()

    def open_url(self, driver, url):
        '''
        4、打开url站点
        :param url:
        :return:
        '''
        driver.get(url)

    def quit_browser(self, driver):
        '''
        5、关闭并停止浏览器服务
        :return:
        '''
        driver.quit()

    def set_browser_window(self, driver, weight, high):
        '''
        6、设置浏览器窗口宽和高
        :param weight:
        :param high:
        :return:
        '''
        driver.set_window_size(weight, high)

    def get_current_handle(self, driver):
        '''
        7、获得当前浏览器的句柄
        :param driver:
        :return:
        '''
        current_handle = driver.current_window_handle
        return current_handle

    def get_all_handle(self, driver):
        '''
        8、获得所有句柄
        :param driver:
        :return:
        '''
        all_handle = driver.window_handle
        return all_handle

    def switch_appoint_handle(self, driver, number1):
        '''
        9、切换句柄
        :param driver:
        :param number1:
        :return:
        '''
        driver.switch_to.window(number1)  # 执行获得所有句柄，并赋值给一个变量，这个句柄值是一个列表。切换句柄可以使用 list[n] 形式

    def close_browser(self, driver):
        '''
        10、关闭新窗口
        :param driver:
        :return:
        '''
        driver.close()

    def kill_browser_process(self, browser_type):
        '''
        11、杀浏览器进程
        :param browser_type:
        :return:
        '''
        try:
            if browser_type.lower() == "firefox":  # browser_type.lower()，将browser_type的值转换为小写
                os.system("taskkill /F /iM firefox.exe")
                print("已杀 火狐 浏览器进程")
            elif browser_type.lower() == "chrome":
                os.system("taskkill /F /iM chrome.exe")
                print("已杀 谷歌 浏览器进程")
            elif browser_type.lower() == "ie":
                os.system("taskkill /F /iM ie.exe")
                print("已杀 IE 浏览器进程")
            elif browser_type.lower() == 'edge':
                os.system("taskkill /F /iM edge.exe")
                print("已杀 Edge 浏览器进程")
            else:
                pass
        except Exception as e:
            raise e


if __name__ == '__main__':
    from tomorrow import threads

    @threads(5)
    def task(data):
        '''
        多线程启动4中浏览器
        :param data:
        :return:
        '''
        test = browserController()
        driver=test.driver_browser(browser_type=data['browser_type'], url=data['url'])
        test.close_browser(driver=driver)

    task_list=[
        {
            'browser_type':'firefox',
            'url':'https://www.baidu.com/'
        },
        {
            'browser_type': 'chrome',
            'url': 'https://www.baidu.com/'
        },
        {
            'browser_type': 'edge',
            'url': 'https://www.baidu.com/'
        },
        {
            'browser_type': 'ie',
            'url': 'https://www.baidu.com/'
        }
    ]
    for i in task_list:
        task(i)
